home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / conhlp03 / fswchsrc / oprate.c < prev    next >
Text File  |  1994-11-16  |  2KB  |  101 lines

  1. /*
  2.     oprate.c
  3.     getch -> getop
  4.     参考文献
  5.     FM TOWNSテクニカルデータブック アスキー出版
  6.     1994/03/02
  7. */
  8.  
  9. #include <dos.h>
  10.  
  11. #ifdef TOWNS
  12. #error not towns err.
  13. #endif
  14.  
  15. /* パッド1入力レジスタ 04d0 */
  16. /* パッド2入力レジスタ 04d2 */
  17. /* -.COM.TRG2.TRG1.RIGHT_B.LEFT_B.BACK.FWD */
  18.  
  19. /* パッド出力レジスタ 04d6 */
  20. /* 0.0.JOY2COM.JOY1COM.JOY2TRIG2.JOY2TRIG1.JOY1TRIG2.JOY1TRIG1 */
  21.  
  22. #define ON (1)
  23. #define OFF (0)
  24.  
  25. #define TRG2 (32)
  26. #define TRG1 (16)
  27. #define RIGHT_B (8)
  28. #define LEFT_B  (4)
  29. #define BACK  (2)
  30. #define FWD   (1)
  31. #define PADINP1 (0x04d0)
  32. #define PADINP2 (0x04d2)
  33. #define PADCTRL (0x04d6)
  34.  
  35. #define LEFT (29)
  36. #define RIGHT (28)
  37. #define UP (30)
  38. #define DOWN (31)
  39. #define EXEC (18)
  40. #define QUIT (17)
  41. #define ESCKEY (0x1b)
  42.  
  43. #define NULL (0)
  44.  
  45. unsigned char padst( void );
  46. unsigned char kbios( void );
  47.  
  48. unsigned char getop( void ){
  49.     char r;
  50.     while(( (r=padst()) ==NULL)&&( (r=kbios()) ==NULL));
  51.     return r;
  52. }
  53.  
  54. unsigned char kbios( void ){
  55.     signed int i;
  56.     union REGS in,out;
  57.     /* バッファクリア */
  58.     in.h.ah = 0x06;
  59.     in.h.al = 0;
  60.     int86(0x90,&in,&out);
  61.     /* 時間待ち */
  62.     for(i=1;i>0;i++);
  63.     /* 入力チェック */
  64.     in.h.ah = 0x07;
  65.     int86(0x90,&in,&out);
  66.     if(out.h.ah!=0) return NULL;
  67.     if(out.h.dh==0xff) return NULL;
  68.     return out.h.dl;
  69. }
  70.  
  71. unsigned char padst( void ){
  72.     static char rs = NULL;
  73.     char ps;
  74.     do{
  75.         ps = (~inp( PADINP1 )) & 0x3f ;
  76.     }while(    ps != NULL && rs == ps );
  77.     switch ( rs = ps ) {
  78.     case TRG2:
  79.         return QUIT ;
  80.     case TRG1:
  81.         return EXEC ;
  82.     case FWD + BACK:        /* sellect ESCキー */
  83.         return ESCKEY ;
  84.     case LEFT_B + RIGHT_B:        /* run 実行キー */
  85.         return EXEC ;
  86.     /* 4方向の処理 */
  87.     case FWD:
  88.         return UP  ;
  89.     case RIGHT_B:
  90.         return RIGHT  ;
  91.     case BACK:
  92.         return DOWN  ;
  93.     case LEFT_B:
  94.         return LEFT  ;
  95.     default:
  96.     /* 斜めは無視 */
  97.         break;
  98.     }
  99.     return NULL;
  100. }
  101.